package com.until.server;

import java.util.HashMap;
import java.util.Map;

/**
 * @implNote  定义自定义sql的处理器,定义的模型的 service层 代码需继承于本类的方法
 * @param <ExampleType> 传递的sql的统一数据类型
 * @param <ActionType> 执行动作的统一数据类型
 * @param <ModelType> 传递的对象的模型类型
 * @author AdminUser
 */
public abstract class ServiceSqlUntil<ModelType,ExampleType,ActionType> {

    /**
     * @implNote  定义自定义sql的处理器:
     * @param <ExampleType> 传递的sql的数据类型
     * @param <ModelType> 模型的数据类型
     * @author AdminUser
     */
    public interface GetServerSqlUntil<ModelType,ExampleType> {
        /**
         * @implSpec 针对于 Mapper 反向生成的 selectByExample 方法的针对模型的动态 sql 构成
         * <br/> 针对不同场合的需求制定的sql生成的接口类，当需要根据业务逻辑进行更新的时候，只需要去在 Service 包下新建不同的 sql 语句即可
         * @param info 传递的 info 对象
         * @return 返回构建好的 Example 对象
         */
        ExampleType selectByModelExample(ModelType info);
    }

    public static class MethodExamples<ModelType,ExampleType,ActionType>{
        public Map<ActionType,GetServerSqlUntil<ModelType,ExampleType>> map = new HashMap<>();
        /**
         * 得到相应动作执行的sql语句,当返回值是null的时候，执行的是得到全部数据
         * @param action 执行的相关动作
         * @return 相关的 Example 对象=> 执行的 sql 语句
         */
        public GetServerSqlUntil<ModelType,ExampleType> getExamples(ActionType action){
            return map.get(action);
        }
    }

    /**
     * 定义了一个存储动作和相关行为的对象，ActionType用于存储key,ExampleType 存储的是你构建好的 自定义 sql语句对象
     */
    protected  MethodExamples<ModelType,ExampleType,ActionType> getMap = new MethodExamples<>();
    protected  MethodExamples<ModelType,ExampleType,ActionType> postMap = new MethodExamples<>();
    protected   MethodExamples<ModelType,ExampleType,ActionType> putMap = new MethodExamples<>();
    protected   MethodExamples<ModelType,ExampleType,ActionType> deleteMap = new MethodExamples<>();

}
